﻿//2516. 每种字符至少取 K 个
//给你一个由字符 'a'、'b'、'c' 组成的字符串 s 和一个非负整数 k 。每分钟，你可以选择取走 s 最左侧 还是 最右侧 的那个字符。
//你必须取走每种字符 至少 k 个，返回需要的 最少 分钟数；如果无法取到，则返回 - 1 。



class Solution {
public:
    int takeCharacters(string s, int k)
    {
        int arr[3] = { 0 };
        int n = s.size();
        for (auto& e : s) arr[e - 'a']++;
        int target[3];
        for (int i = 0; i < 3; i++)
        {
            target[i] = arr[i] - k;
            arr[i] = 0;
            if (target[i] < 0) return -1;
        }
        int begin = 0, end = -1;
        int ans = -1;
        for (end = 0; end < n; end++)
        {
            arr[s[end] - 'a']++;
            while (arr[s[end] - 'a'] > target[s[end] - 'a'])
            {
                arr[s[begin] - 'a']--;
                begin++;
            }
            if (arr[0] <= target[0] && arr[1] <= target[1] && arr[2] <= target[2])
            {
                ans = max(ans, end - begin + 1);
            }
        }
        if (ans == -1) return ans;
        return n - ans;
    }
};